{ "cells": [ { "cell_type": "markdown", "id": "f0ad9c98", "metadata": {}, "source": [ "# Machine Learning example" ] }, { "cell_type": "markdown", "id": "b1f70d12", "metadata": {}, "source": [ "This is fun! This is fun!" ] }, { "cell_type": "code", "execution_count": 1, "id": "5d28d5bf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "20.25\n" ] } ], "source": [ "print(3**5/12)" ] }, { "cell_type": "code", "execution_count": 2, "id": "8363cb57", "metadata": {}, "outputs": [], "source": [ "#loading libraries\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn import model_selection\n", "from sklearn.metrics import classification_report\n", "from sklearn.metrics import confusion_matrix\n", "from sklearn.metrics import accuracy_score\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis\n", "from sklearn.naive_bayes import GaussianNB\n", "from sklearn.svm import SVC\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "78d6cfd8", "metadata": {}, "outputs": [], "source": [ "url = \"https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv\"\n", "names1 = ['sepal-length','sepal-width','petal-length','petal-width','class']\n", "dataB = pd.read_csv(url,names=names1)\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "fd9cd962", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " sepal-length sepal-width petal-length petal-width class\n", "0 5.1 3.5 1.4 0.2 Iris-setosa\n", "1 4.9 3.0 1.4 0.2 Iris-setosa\n", "2 4.7 3.2 1.3 0.2 Iris-setosa\n", "3 4.6 3.1 1.5 0.2 Iris-setosa\n", "4 5.0 3.6 1.4 0.2 Iris-setosa\n", "5 5.4 3.9 1.7 0.4 Iris-setosa\n", "6 4.6 3.4 1.4 0.3 Iris-setosa\n", "7 5.0 3.4 1.5 0.2 Iris-setosa\n", "8 4.4 2.9 1.4 0.2 Iris-setosa\n", "9 4.9 3.1 1.5 0.1 Iris-setosa\n", "10 5.4 3.7 1.5 0.2 Iris-setosa\n", "11 4.8 3.4 1.6 0.2 Iris-setosa\n", "12 4.8 3.0 1.4 0.1 Iris-setosa\n", "13 4.3 3.0 1.1 0.1 Iris-setosa\n", "14 5.8 4.0 1.2 0.2 Iris-setosa\n", "15 5.7 4.4 1.5 0.4 Iris-setosa\n", "16 5.4 3.9 1.3 0.4 Iris-setosa\n", "17 5.1 3.5 1.4 0.3 Iris-setosa\n", "18 5.7 3.8 1.7 0.3 Iris-setosa\n", "19 5.1 3.8 1.5 0.3 Iris-setosa\n" ] } ], "source": [ "# dataB has the iris database that we will analyze. The names\n", "# above are the column names\n", "print(dataB.head(20))" ] }, { "cell_type": "code", "execution_count": 5, "id": "c5d59fff", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " sepal-length sepal-width petal-length petal-width\n", "count 150.000000 150.000000 150.000000 150.000000\n", "mean 5.843333 3.054000 3.758667 1.198667\n", "std 0.828066 0.433594 1.764420 0.763161\n", "min 4.300000 2.000000 1.000000 0.100000\n", "25% 5.100000 2.800000 1.600000 0.300000\n", "50% 5.800000 3.000000 4.350000 1.300000\n", "75% 6.400000 3.300000 5.100000 1.800000\n", "max 7.900000 4.400000 6.900000 2.500000\n" ] } ], "source": [ "print(dataB.describe())" ] }, { "cell_type": "code", "execution_count": 6, "id": "eab3f719", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 150 entries, 0 to 149\n", "Data columns (total 5 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 sepal-length 150 non-null float64\n", " 1 sepal-width 150 non-null float64\n", " 2 petal-length 150 non-null float64\n", " 3 petal-width 150 non-null float64\n", " 4 class 150 non-null object \n", "dtypes: float64(4), object(1)\n", "memory usage: 6.0+ KB\n", "None\n" ] } ], "source": [ "print(dataB.info())" ] }, { "cell_type": "code", "execution_count": 7, "id": "8f01c318", "metadata": {}, "outputs": [], "source": [ "# split the data into the numerical inputs (x values)\n", "# and the output (y values - classifications)\n", "array = dataB.values\n", "X = array[:,0:4]\n", "Y = array[:,4]" ] }, { "cell_type": "code", "execution_count": 40, "id": "f9db27cd", "metadata": {}, "outputs": [], "source": [ "validation_ratio = 0.40" ] }, { "cell_type": "code", "execution_count": 9, "id": "a5f6568c", "metadata": {}, "outputs": [], "source": [ "# this is the percent of the data that I will use as my validation data,\n", "# what's left is my training data." ] }, { "cell_type": "code", "execution_count": 41, "id": "7e4fad5c", "metadata": {}, "outputs": [], "source": [ "X_train, X_valid, Y_train, Y_valid =\\\n", " model_selection.train_test_split(X,Y,\\\n", " test_size=validation_ratio)\n", "scoring=\"accuracy\"" ] }, { "cell_type": "code", "execution_count": 11, "id": "ff03a41e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(90, 60)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(X_train),len(X_valid)" ] }, { "cell_type": "code", "execution_count": 14, "id": "e6b2a876", "metadata": {}, "outputs": [], "source": [ "# algorithms, stored in an list with a shortcut name\n", "models = []\n", "models.append(('LR',LogisticRegression(solver=\\\n", " 'liblinear',multi_class='ovr')))\n", "models.append(('LDA',LinearDiscriminantAnalysis()))\n", "models.append(('KNN',KNeighborsClassifier()))\n", "models.append(('CART',DecisionTreeClassifier()))\n", "models.append(('NB',GaussianNB()))\n", "models.append(('SVM',SVC(gamma='auto')))" ] }, { "cell_type": "code", "execution_count": 42, "id": "0c48943e", "metadata": {}, "outputs": [], "source": [ "# arrays to show our results of testing out our algorithms\n", "results = []\n", "names = []" ] }, { "cell_type": "code", "execution_count": 43, "id": "85528125", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LR: 0.933, 0.038\n", "LDA: 0.989, 0.025\n", "KNN: 0.956, 0.031\n", "CART: 0.967, 0.033\n", "NB: 0.944, 0.046\n", "SVM: 0.978, 0.031\n" ] } ], "source": [ "from warnings import simplefilter\n", "simplefilter(action='ignore', category=FutureWarning)\n", "for name,model in models:\n", " kfold = model_selection.KFold(n_splits=6)\n", " # we will be splitting our training set into 6 pieces\n", " cv_results = model_selection.cross_val_score(model,X_train,\\\n", " Y_train,cv=kfold)\n", " results += [cv_results]\n", " names += [name]\n", " print(name+\": \"+str(round(cv_results.mean(),3))+\", \"\\\n", " +str(round(cv_results.std(),3)))\n", "\n", " " ] }, { "cell_type": "code", "execution_count": 39, "id": "e3d4b873", "metadata": {}, "outputs": [ { "data": { "image/png": "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1JBkJCYmltjuz6HmlVdeMSSVGTjGjx9vSDK+/vprm/YnnnjCsFgsxoEDBwzD+G+oad26tXH+/Hlr3a5duwxJxooVKy45BlBdcfkJuAIJCQlydXVVv379JEkeHh568MEHtW3bNh06dKjMbbdu3aq7775bPj4+1rYaNWrooYcesqn74osvJKnEpaEOHTooKChImzZtsmmvVauW7r777oruko3/vcQjSW3atNHZs2eVnZ1t0961a1e5u7tbXwcFBUmSIiMjZbFYSrT/+9//rpT5SfYfn3r16ikkJMT6unbt2rr55pt12223qX79+uWa6yOPPGLz+qGHHpKjo6N1LpL0yy+/6OGHH5afn58cHBzk5OSkLl26SJLS0tJK9PnAAw9cdl/vuOMO63jvvvuujh07VqJm8+bNatmypTp06GDTPmjQIBmGoc2bN9u09+jRQw4ODtbXbdq0kVS5XyPgWiHUABX0008/6csvv1SPHj1kGIZOnDihEydOqG/fvpL++46oS8nNzZWvr2+J9j+35ebmSrr4x/jP6tevb11frLS6iqpTp47N6+L7W86cOWPTXrt2bZvXNWvWLLP97NmzlxzTx8dHbm5uOnz4cLnmaO/x+fOciudlz1z9/PxsXjs6OqpOnTrWsU6fPq3w8HB9/fXXmjZtmrZs2aJvvvlGa9askVTy+Lm5ucnLy6vM/ZSkO++8U2vXrtX58+c1cOBANWjQQMHBwVqxYoW1Jjc395LHonj9/yrv1xi4HhBqgApKTEyUYRhavXq1atWqZV169OghSVqyZImKioouuX2dOnX066+/lmjPysoqUSdJmZmZJWqPHz9uc6ZHks2ZkeuRg4OD7rnnHqWkpJS40bc09h6fyvDnr9H58+eVm5trncvmzZt1/PhxJSYmaujQobrzzjvVvn17eXp6ltqfPV+z3r17a9OmTTp58qS2bNmiBg0a6OGHH9aOHTskXTwelzoWkq7K8QCqC0INUAFFRUVasmSJmjRpoi+++KLE8swzzygzM1OffvrpJfvo0qWLNm/ebPOAuwsXLui9996zqSu+lLRs2TKb9m+++UZpaWnWd8rYqzr/izwmJkaGYWjYsGEqLCwssf7cuXP6+OOPJV2941OW5cuX27x+9913df78eeu7y4pDyp/fufWvf/2r0ubg7OysLl26aMaMGZKk1NRUSdI999yjH374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zzNnzig9PV0BAQFydXWtlD7T0tIqpR8AAKozu0JNTk6OioqK5Ovra9Pu6+urrKysUrcJCwvT8uXLFRUVpbNnz+r8+fO6//77NWfOnFLrd+3ape+//14JCQk27aGhoVq6dKmaNWumX3/9VdOmTVNYWJj279+vOnXqlNpXXFycpkyZYs8u2uXHH3+UJA0bNuyqjVGZPD09q3oKAABcNXaFmmIWi8XmtWEYJdqK/fDDDxo1apQmTZqk7t27KzMzU+PGjdOIESNKBBfp4lma4OBgdejQwaY9MjLS+v+tW7dWp06d1KRJEy1ZskRjx44tdeyYmBibdXl5efL39y/3fl5Onz59JEktWrSQm5tbpfSZlpam6OhoLVu2TEFBQZXSp3Qx0Nx6662V1h8AANWNXaHGx8dHDg4OJc7KZGdnlzh7UywuLk6dO3fWuHHjJElt2rSRu7u7wsPDNW3aNNWrV89am5+fr5UrV2rq1KmXnYu7u7tat26tQ4cOXbLG2dlZzs7O5dm1CvHx8bG54bkyBQUFqV27dlelbwAAzMiuG4Vr1qypkJAQJSUl2bQnJSUpLCys1G3y8/NVo4btMA4ODpIunuH5X++++64KCgoUHR192bkUFBQoLS3NJhQBAIAbl93vfho7dqwWLVqkxMREpaWlacyYMcrIyNCIESMkXbzkM3DgQGt9r169tGbNGsXHx+uXX37RV199pVGjRqlDhw6qX7++Td8JCQnq06dPqffIPPvss9q6dasOHz6sr7/+Wn379lVeXp4effRRe3cBAACYkN331ERFRSk3N1dTp05VZmamgoODtX79ejVq1EiSlJmZafPMmkGDBunUqVOaO3eunnnmGd100026++67NWPGDJt+Dx48qO3bt+uzzz4rddyjR4+qf//+ysnJUd26ddWxY0ft3LnTOi4AALixWYw/XwMysby8PHl7e+vkyZPy8vKq6umUas+ePQoJCVFKSgr31AAAoPL//eaznwAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQ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9YnwW7ZssTkurq6uatWqlRYuXFgVU64WsrOzNXz4cDVs2FDOzs7y8/NT9+7dtXXrVvn4+GjatGmlbhcXFycfHx8VFhZavz+DgoJK1L377ruyWCwKCAi4yntSMYSaaqr4LfNpaWl69tln9fzzz9/QP6jlUXzMDhw4oKVLl+qmm25St27d9M9//rNE7fvvv6/g4GC1bNlSa9asqYLZVh+LFi3SI488orlz5+r//u//JEkuLi5KSEjQwYMHL7v9qVOn9Morr1ztaVYL6enpCgkJ0ebNmzVz5kx999132rBhg7p27aonn3zSpvatt97S//3f/ykxMbHUvry8vJSZmanjx49r3bp1+uOPP9SjRw8VFhYqMzPTusyePdtaW7y8/vrr12J3q5yLi4tmzJih33//vcy6AwcOKDMzUz/88IOGDx+uJ554okTIvFE88MAD2rdvn5YsWaKDBw/qo48+0l133aXTp08rOjpaixcvLvUfyG+99ZYGDBigmjVrSrr41P7s7Gzt2LHDpi4xMVENGza8JvtSEYSaasrT01N+fn4KCAjQ0KFD1aZNG3322WdVPa1qrfiYNWzYUHfeeacWLlyoiRMnatKkSTpw4IBNbUJCgqKjoxUdHV3qZ5DdKGbOnKmnnnpK77zzjoYOHWptb968ubp27aoXXnjhsn384x//0KxZs5SdnX01p1otjBw5UhaLRbt27VLfvn3VrFkztWrVSmPHjtXOnTutdVu3btWZM2c0depU/fHHH/ryyy9L9GWxWOTn56d69eqpffv2GjNmjP7973/rwIED8vPzsy7e3t7W2v9tuxF069ZNfn5+iouLK7Pu5ptvlp+fnwIDAzVq1CgFBARoz54912iW1ceJEye0fft2zZgxQ127dlWjRo3UoUMHxcTEqEePHhoyZIh+/vnnEt+P27Zt06FDhzRkyBBrm6Ojox5++GGbUH706FFt2bJFDz/88DXbJ3sRaqo5wzC0ZcsWpaWlycnJqaqnc915+umnZRiGPvzwQ2vbzz//rB07duihhx7SQw89pOTkZP3yyy9VOMuqMX78eL344ov65JNP9MADD5RY/9JLL+n999/XN998U2Y//fv3V9OmTTV16tSrNdVq4T//+Y82bNigJ598Uu7u7iXW/+/nyiUkJKh///5ycnJS//79LxucT5w4oXfeeUeS+Dn/Hw4ODpo+fbrmzJmjo0ePXrbeMAxt2LBBR44cUWho6DWYYfXi4eEhDw8PrV27VgUFBSXWt27dWnfccYfeeustm/bExER16NBBwcHBNu1DhgzRqlWrlJ+fL+niZdP77rvvkp/1WB0Qaqqp5557Th4eHnJ2dlbXrl1lGIZGjRpV1dO67tSuXVs333yz9T4Q6eIPcGRkpPWemvvuu++SlwjM6tNPP9WMGTP04Ycfqlu3bqXWtGvXTg899JDGjx9fZl/F9z0sXLhQP//889WYbrXw008/yTAMtWjRosy6vLw8vf/++4qOjpYkRUdHa/Xq1crLy7OpO3nypDw8POTu7q5atWpp5cqVuv/++y/b/43mb3/7m2677TZNnjz5kjUNGjSQh4eHatasqR49emjy5Mm68847r+EsqwdHR0ctXrxYS5Ys0U033aTOnTvr+eef17fffmutGTx4sFavXm39GKLTp0/rvffeszlLU+y2225TkyZNtHr1ahmGocWLF2vw4MHXbH8qglBTTY0bN0579+7V1q1b1bVrV02YMOGSHxqKshmGYb2xsKioSEuWLLH+wZEu/tFZsmSJioqKqmqK11ybNm0UEBCgSZMmlbjJ939NmzZN27Ztu+ylz+7du+svf/mLJk6cWNlTrTaK70Mo/l66lHfeeUeNGzdW27ZtJV38w9C4cWOtXLnSps7T01N79+5VSkqKFixYoCZNmmjBggVXZ/LXuRkzZmjJkiX64YcfSl2/bds27d27V3v37tWiRYs0ffp0xcfHX+NZVg8PPPCAjh8/ro8++kjdu3fXli1b1K5dOy1evFjSxTOrFy5c0KpVqyRJq1atkmEY6tevX6n9DR48WG+99Za2bt2q06dP669//eu12pUKIdRUUz4+PmratKk6deqk999/X6+99po+//zzqp7WdSc3N1e//fabAgMDJUkbN27UsWPHFBUVJUdHRzk6Oqpfv346evToDXXP0i233KKtW7cqMzNT99133yWDTZMmTTRs2DCNHz/+su++e+mll7Rq1SqlpqZejSlXuVtvvVUWi0VpaWll1iUmJmr//v3W7y9HR0ft37+/xCWoGjVqqGnTpmrRooWGDx+uAQMGKCoq6mruwnXrzjvvVPfu3fX888+Xuj4wMFBNmzZVq1at9Nhjj2nAgAGlvkHgRuHi4qJ7771XkyZNUnJysgYNGmQ90+Xt7a2+fftaL0G99dZb6tu3r7y8vErt65FHHtHOnTsVGxurgQMHytHR7o+MvKYINdeBWrVq6R//+IeeffbZG/5t3fZ6/fXXVaNGDetbmBMSEtSvXz/rv+qKl0ceeeSGu2G4YcOG2rp1q7KzsxUREVHi8kixSZMm6eDBgyXONPxZhw4d9Pe///2yl6uuV7Vr11b37t01b948/fHHHyXWnzhxQt999512796tLVu22Hx/ffnll/rmm2/0/fffX7L/MWPGaN++ffrggw+u5m5ct1566SV9/PHHSk5Ovmytg4PDDfeohrK0bNnS5nt2yJAh+uqrr/TJJ5/oq6++KvXSU7HatWvr/vvv19atW6v9pSepAp/Sjcpz8uRJ7d2716atdu3apdY++eSTmjFjht5///0Sn2Z+IynrmJ06dUpZWVk6d+6cDh8+rGXLlmnRokWKi4tT06ZN9dtvv+njjz/WRx99VOKGuEcffVQ9evTQb7/9prp1616r3alyDRo00JYtW9S1a1dFRERo48aNJWp8fX01duxYvfzyy5ft75///KdatWpV7f81V1Hz589XWFiYOnTooKlTp6pNmzY6f/68kpKSFB8fr+7du6tDhw6l3s/RqVMnJSQk6LXXXiu1by8vLw0dOlSTJ09Wnz59LnuZ60bTunVrPfLII5ozZ06JddnZ2Tp79qwKCgq0a9cuvf322zfk78nc3Fw9+OCDGjx4sNq0aSNPT0/t3r1bM2fOVO/eva11Xbp0UdOmTTVw4EA1bdr0svcfLV68WPPnz1edOnWu9i5cMc7UVKEtW7bo9ttvt1kmTZpUam3dunU1YMAAxcbG6sKFC9d4ptVHWcds0qRJqlevnpo2baoBAwbo5MmT2rRpk5577jlJ0tKlS+Xu7q577rmnRL9du3aVp6en3n777Wu6P9VB8aWoEydO6N5779WJEydK1IwbN04eHh6X7atZs2YaPHiwzp49exVmWvUCAwO1Z88ede3aVc8884yCg4N17733atOmTXr99de1bNmyUt9JJl2812HZsmUqLCy8ZP9PP/200tLS9N57712tXbiuvfjii6WerW7evLn1Z/+5557T8OHDSw0/Zufh4aHQ0FC99tpruvPOOxUcHKyJEydq2LBhmjt3rk3t4MGD9fvvv5fr7Iurq+t1EWgkyWJwPQMAAJgAZ2oAAIApEGoAAIApEGoAAIApEGoAAIApEGoAAIApEGoAAIApEGoAAIApEGoAAIApEGoAAIApEGoAAIApEGoAAIApEGoAAIAp/D/Vq1R5GVnjdQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure()\n", "fig.suptitle('Algorithm Comparison')\n", "ax = fig.add_subplot(111)\n", "plt.boxplot(results)\n", "ax.set_xticklabels(names)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 48, "id": "6a40f82d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'algorithm': 'auto', 'leaf_size': 30, 'metric': 'minkowski', 'metric_params': None, 'n_jobs': None, 'n_neighbors': 5, 'p': 2, 'weights': 'uniform'}\n", "0.95\n", "[[19 0 0]\n", " [ 0 19 2]\n", " [ 0 1 19]]\n", " precision recall f1-score support\n", "\n", " Iris-setosa 1.00 1.00 1.00 19\n", "Iris-versicolor 0.95 0.90 0.93 21\n", " Iris-virginica 0.90 0.95 0.93 20\n", "\n", " accuracy 0.95 60\n", " macro avg 0.95 0.95 0.95 60\n", " weighted avg 0.95 0.95 0.95 60\n", "\n" ] } ], "source": [ "# more specific data about one algorithm - K Nearest Neighbors\n", "alg = KNeighborsClassifier()\n", "print(alg.get_params())\n", "alg.fit(X_train,Y_train)\n", "predictions = alg.predict(X_valid)\n", "print(accuracy_score(Y_valid,predictions))\n", "print(confusion_matrix(Y_valid,predictions))\n", "print(classification_report(Y_valid,predictions))\n" ] }, { "cell_type": "code", "execution_count": null, "id": "c2b251f6", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.13" } }, "nbformat": 4, "nbformat_minor": 5 }